/**
 *  发布订阅模型
 * 1.发布者会给订阅者提供一个方法，以便于订阅某些事件发生时要作什么事情。
 * 2.当发布者可以通过触发一些操作 来 告知订阅者 订阅已经到来，可以去做对应的后续处理了
 * 3.当某个订阅者不想再订阅的时候可以进行订阅的取消
 */

class Observer{
    //发布订阅模式又叫观察者模式 new Observer->发布者
    //发布者首先提供一些接口 让订阅者可以定义一些事件 ->addElementListener
    //发布者可以触发订阅事件
    //发布者可以解除某些订阅
    

    //存储事件对象
    obj={}
    //订阅接口
    on(subscribeName, callback){
        if(!this.obj[subscribeName]){
            this.obj[subscribeName] = [callback]

        }else{
            this.obj[subscribeName].push(callback)
        }
    }

    //触发事件接口
    trigger(subscribeName){
        const subscribers = this.obj[subscribeName] || []
        subscribers.forEach(sub => sub());
    }

    //移除事件接口
    remove(subscribeName,subscriber){
        const subscribers = this.obj[subscribeName] || []
        const index = subscribers.findIndex(el => subscriber === el)
        if(index >-1){
            subscribers.splice(index,1)
        }
        console.log(`取消了${subscribeName}订阅的${subscriber}`)
    }
}

const bookStorBoss=new Observer();

const listener = ()=>{
    console.log('用户1要去买书')
}

bookStorBoss.on("newBook",listener)
bookStorBoss.on("newBook",()=>{
    console.log("用户2要去买书")
})
bookStorBoss.on("newPen",()=>{
    console.log('我要去买书了')
})

bookStorBoss.trigger("newBook");
bookStorBoss.trigger('newPen')
bookStorBoss.remove("newBook", listener)
console.log('取消一个订阅后')
bookStorBoss.trigger("newBook");